#include"speechManager.h"
#include<map>

//构造函数
SpeechManager::SpeechManager()
{
	//初始化容器和属性
	this->initSpeech();

	//创建12名选手
	this->createSpeaker();

	//加载往届记录
	this->loadRecord();

}

//菜单功能
void SpeechManager::show_Menu()
{
	cout << "*********************************************" << endl;
	cout << "*************欢迎参加演讲比赛*************" << endl;
	cout << "*************1、开始演讲比赛**************" << endl;
	cout << "*************2、查看往届记录**************" << endl;
	cout << "*************3、清空比赛记录**************" << endl;
	cout << "*************0、退出比赛程序**************" << endl;
	cout << "*********************************************" << endl;
	cout << endl;
}

//退出系统
void SpeechManager::exitSystem()
{
	cout << "欢迎下次使用" << endl;

	system("pause");

	exit(0);
}

void SpeechManager::initSpeech()
{
	//容器都置空
	this->v1.clear();
	this->v2.clear();
	this->vVictory.clear();
	this->m_Speaker.clear();

	//初始化比赛轮数
	this->m_Index = 1;

	//将记录的容器 也清空
	this->m_Record.clear();
}

//创建12名选手
void SpeechManager::createSpeaker()
{
	string nameSeed = "ABCDEFGHIJKL";
	for (int i = 0;i < nameSeed.size();i++)
	{
		string name = "选手";
		name += nameSeed[i];

		//创建具体选手
		Speaker sp;
		sp.m_Name = name;

		for (int j = 0;j < 2;j++)
		{
			sp.m_Score[j] = 0;

		}

		//创建选手编号，并且放入到v1容器中
		this->v1.push_back(i + 10001);

		//选手编号以及对应选手放入到map容器中
		this->m_Speaker.insert(make_pair(i + 10001, sp));
	}
}

//开始比赛    比赛整个流程控制函数
void SpeechManager::startSpeech()
{
	//第一轮开始比赛

	//1、抽签
	this->speechDraw();   //同一类的成员函数在特定条件下可以相互调用

	//2、比赛
	this->speechContest();

	//3、显示晋级结果
	this->showScore();

	//第二轮开始比赛
	this->m_Index++;

	//1、抽签
	this->speechDraw();

	//2、比赛
	this->speechContest();

	//3、显示晋级结果
	this->showScore();

	//4、保存分数到文件中
	this->saveRecord();
	
	//重置比赛，获取记录
	//初始化容器和属性
	this->initSpeech();

	//创建12名选手
	this->createSpeaker();

	//加载往届记录
	this->loadRecord();

	cout << "本届比赛完毕!" << endl;
	system("pause");
	system("cls");
}

//抽签
void SpeechManager::speechDraw()
{
	cout << "第<<" << this->m_Index << ">>轮比赛选手正在抽签" << endl;
	cout << "------------------------------------" << endl;
	cout << "抽签后演讲顺序如下：" << endl;

	if (this->m_Index == 1)
	{
		//第一轮比赛
		random_shuffle(v1.begin(), v1.end());
		for (const auto& it : v1)
		{
			cout << it << " ";
		}
		cout << endl;
	}
	else
	{
		//第二轮比赛
		random_shuffle(v1.begin(), v1.end());
		for (const auto& it : v1)
		{
			cout << it << " ";
		}
		cout << endl;
	}

	cout << "----------------------" << endl;
	system("pause");
	cout << endl;
}

//比赛
void SpeechManager::speechContest()
{
	cout << "--------------第" << this->m_Index << "轮比赛正式开始----------------" << endl;

	//准备临时容器 存放小组成绩
	multimap<double, int, greater<double>> groupScore;

	int num = 0;  //记录人员个数，六人一组

	vector<int> v_Src;   //比赛选手容器
	if (this->m_Index == 1)
	{
		v_Src = v1;
	}
	else
	{
		v_Src = v2;
	}

	//遍历所有选手进行比赛
	for (const auto& it : v_Src)
	{
		num++;
		//评委打分
		deque<int> d;
		for (int i = 0;i < 10;i++)
		{
			double score = (rand() % 401 + 600) / 10.f;    //600~1000
			//cout << score << " ";
			d.push_back(score);
		}
		//cout << endl;
		sort(d.begin(), d.end(),greater<int>());
		d.pop_front();  //去除最高分
		d.pop_back();  //去除最低分

		double sum = accumulate(d.begin(), d.end(), 0.0f);  //总分

		double avg = sum / double(d.size());  //平均分

		//打印平均分
		//cout << "编号：" << it << "  姓名" << this->m_Speaker[it].m_Name << "  获取平均分：" << avg << endl;

		//将平均分放入到map容器里       (通过键值对的形式访问，前面m_Speaker[it]所表示的编号是键的意思，后面的的的分数是对)
		this->m_Speaker[it].m_Score[this->m_Index - 1] = avg;

		//将打分数据，放入到临时小组容器中
		groupScore.insert(make_pair(avg, it));  //key是得分，value是具体的人员编号

		//每六人取出前三名
		if (num % 6 == 0)
		{
			cout << "第" << num / 6 << "小组比赛名次：" << endl;
			for (const auto& it1 : groupScore)
			{
				cout << "编号：" << it1.second << "  姓名：" << this->m_Speaker[it1.second].m_Name;
				cout << "  成绩：" << this->m_Speaker[it1.second].m_Score[this->m_Index - 1] << endl;
			}

			//取出前三名
			int count = 0;
			for (const auto& it2 : groupScore)
			{
				if (count < 3)
				{
					if (this->m_Index == 1)
					{
						v2.push_back(it2.second);
					}
					else
					{
						vVictory.push_back(it2.second);
					}
				}
				count++;
			}
			groupScore.clear();
		}
	}
	cout << "-------------------第" << this->m_Index << "轮比赛完毕----------------------" << endl;
	system("pause");

}

//显示得分
void SpeechManager::showScore()
{
	cout << "-------------------第" << this->m_Index << "轮晋级选手信息如下：---------------------" << endl;

	vector<int> v;
	if (this->m_Index == 1)
	{
		v = v2;
	}
	else
	{
		v = vVictory;
	}

	for (const auto& it : v)
	{
		cout << "选手编号：" << it << "  姓名：" << this->m_Speaker[it].m_Name << "得分：" <<
			this->m_Speaker[it].m_Score[this->m_Index - 1] << endl;
	}
	cout << endl;
	
	system("pause");
	system("cls");
	this->show_Menu();
}

//保存记录
void SpeechManager::saveRecord()
{
	ofstream ofs;
	ofs.open("speech.csv", ios::out | ios::app);  //用追加的方式写文件

	//将每个人数据写入到文件中
	for (const auto & it:vVictory)
	{
		ofs << it << "," << this->m_Speaker[it].m_Score[1] << ",";
	}
	ofs << endl;

	//关闭
	ofs.close();
	cout << "记录已经保存" << endl;

	//更改文件不为空状态
	this->fileIsEmpty = false;
}

//读取记录
void SpeechManager::loadRecord()
{
	ifstream ifs("speech.csv", ios::in);  //读文件

	if (!ifs.is_open())
	{
		this->fileIsEmpty = true;
		//cout << "文件不存在" << endl;
		ifs.close();
		return;
	}

	//文件清空情况
	char ch;
	ifs >> ch;
	if (ifs.eof())  //检查是否已经到达文件末尾
	{
		//cout << "文件为空" << endl;
		this->fileIsEmpty = true;
		ifs.close();
		return;
	}

	//文件不为空
	//this->fileIsEmpty = false;

	ifs.putback(ch);  //将上面读取的单个字符 放回来

	string data;
	int index = 0;
	while (ifs >> data)
	{
		//cout << data << endl;
		//10002,86,675,10009,81,3,10007,78,55

		vector<string> v;  //存放6个字符串

		int pos = -1;   //查到“，”位置的变量
		int start = 0;

		while (true)
		{
			pos = data.find(",", start);
			if (pos == -1)
			{
				//没有找到情况
				break;
			}
			string temp = data.substr(start, pos - start);
			//cout << temp << endl;
			v.push_back(temp);
			start = pos + 1;
		}

		this->m_Record.insert(make_pair(index, v));
		index++;

	}

	ifs.close();

	/*for (const auto& it : this->m_Record)
	{
		cout << it.first << "冠军编号：" << it.second[0] << "分数："
			<< it.second[1] << endl;
	}*/
}

//显示往届记录
void SpeechManager::showRecord()
{
	if (this->fileIsEmpty)
	{
		cout << "文件为空或者文件不存在！" << endl;
	}
	else
	{
		for (int i = 0;i < this->m_Record.size();i++)
		{
			cout << "第" << i + 1 << "届"
				<< "冠军编号：" << this->m_Record[i][0] << "得分：" << this->m_Record[i][1] << " "
				<< "亚军编号：" << this->m_Record[i][2] << "得分：" << this->m_Record[i][3] << " "
				<< "季军编号：" << this->m_Record[i][4] << "得分：" << this->m_Record[i][5] << endl;
		}
	}

	system("pause");
	system("cls");

}

//清空文件
void SpeechManager::clearRecord()
{
	cout << "是否确定清空文件？" << endl;
	cout << "1、是" << endl;
	cout << "2、否" << endl;

	int select = 0;
	cin >> select;
	if (select == 1)
	{
		//确认清空
		ofstream ofs("speech.csv", ios::trunc);
		ofs.close();

		//初始化容器和属性
		this->initSpeech();

		//创建12名选手
		this->createSpeaker();

		//加载往届记录
		this->loadRecord();

		cout << "清空成功!" << endl;
	}
	system("pause");
	system("cls");


}

//析构函数
SpeechManager::~SpeechManager()
{

}

